<?php
namespace app\api\service;

use app\api\model\DictType;
use app\api\model\DictData;
use think\Exception;

class DictService
{
    /**
     * 获取字典类型列表
     * @param array $params
     * @return array
     */
    public function getDictTypeList($params)
    {
        $dictTypeModel = new DictType();
        return $dictTypeModel->getList($params);
    }

    /**
     * 获取字典类型详情
     * @param int $dictId
     * @return array|null
     */
    public function getDictTypeDetail($dictId)
    {
        return DictType::get($dictId);
    }

    /**
     * 新增字典类型
     * @param array $data
     * @return int
     * @throws Exception
     */
    public function addDictType($data)
    {
        $dictTypeModel = new DictType();

        // 检查字典类型是否唯一
        if (!$dictTypeModel->checkDictTypeUnique($data['dict_type'])) {
            throw new Exception('字典类型已存在');
        }

        return $dictTypeModel->save($data);
    }

    /**
     * 修改字典类型
     * @param array $data
     * @return bool
     * @throws Exception
     */
    public function updateDictType($data)
    {
        if (!isset($data['dict_id'])) {
            throw new Exception('字典ID不能为空');
        }

        $dictTypeModel = DictType::get($data['dict_id']);
        if (!$dictTypeModel) {
            throw new Exception('字典类型不存在');
        }

        // 检查字典类型是否唯一（排除当前记录）
        if (!$dictTypeModel->checkDictTypeUnique($data['dict_type'], $data['dict_id'])) {
            throw new Exception('字典类型已存在');
        }

        return $dictTypeModel->save($data);
    }

    /**
     * 删除字典类型
     * @param array $dictIds
     * @return int
     * @throws Exception
     */
    public function deleteDictType($dictIds)
    {
        $dictDataModel = new DictData();

        foreach ($dictIds as $dictId) {
            $dictType = DictType::get($dictId);
            if ($dictType) {
                // 检查是否存在字典数据
                $dictDataCount = $dictDataModel->where('dict_type', $dictType['dict_type'])->count();
                if ($dictDataCount > 0) {
                    throw new Exception("字典类型【{$dictType['dict_name']}】下存在字典数据，不能删除");
                }
            }
        }

        return DictType::destroy($dictIds);
    }

    /**
     * 获取字典数据列表
     * @param array $params
     * @return array
     */
    public function getDictDataList($params)
    {
        $dictDataModel = new DictData();
        return $dictDataModel->getList($params);
    }

    /**
     * 根据字典类型获取字典数据
     * @param string $dictType
     * @return array
     */
    public function getDictDataByType($dictType)
    {
        $dictDataModel = new DictData();
        return $dictDataModel->getByDictType($dictType);
    }

    /**
     * 获取字典数据详情
     * @param int $dictCode
     * @return array|null
     */
    public function getDictDataDetail($dictCode)
    {
        return DictData::get($dictCode);
    }

    /**
     * 新增字典数据
     * @param array $data
     * @return int
     * @throws Exception
     */
    public function addDictData($data)
    {
        $dictDataModel = new DictData();

        // 检查字典标签是否唯一
        if (!$dictDataModel->checkDictLabelUnique($data['dict_type'], $data['dict_label'])) {
            throw new Exception('同一字典类型下字典标签已存在');
        }

        return $dictDataModel->save($data);
    }

    /**
     * 修改字典数据
     * @param array $data
     * @return bool
     * @throws Exception
     */
    public function updateDictData($data)
    {
        if (!isset($data['dict_code'])) {
            throw new Exception('字典编码不能为空');
        }

        $dictDataModel = DictData::get($data['dict_code']);
        if (!$dictDataModel) {
            throw new Exception('字典数据不存在');
        }

        // 检查字典标签是否唯一（排除当前记录）
        if (!$dictDataModel->checkDictLabelUnique($data['dict_type'], $data['dict_label'], $data['dict_code'])) {
            throw new Exception('同一字典类型下字典标签已存在');
        }

        return $dictDataModel->save($data);
    }

    /**
     * 删除字典数据
     * @param array $dictCodes
     * @return int
     */
    public function deleteDictData($dictCodes)
    {
        return DictData::destroy($dictCodes);
    }

    /**
     * 刷新字典缓存
     * @return bool
     */
    public function refreshDictCache()
    {
        // 这里可以实现缓存刷新逻辑，如 Redis 缓存等
        // 示例：清除所有字典相关的缓存
        // cache('dict_cache', null);
        return true;
    }

    /**
     * 获取字典类型选项
     * @return array
     */
    public function getDictTypeOptions()
    {
        $dictTypeModel = new DictType();
        return $dictTypeModel->getOptionSelect();
    }
}